﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace WebApplication1
{
    public class Map
    {
        const int xSizeMap = 15;
        const int ySizeMap = 15;
        protected Random rand = new Random();
        public Case[,] map = new Case[xSizeMap, ySizeMap];
        protected bool[,] visite = new bool[xSizeMap, ySizeMap];
        public int xJoueur { get; set; }
        public int yJoueur { get; set; }
        protected int xFinal { get; set; }
        protected int yFinal { get; set; }
        public Vaisseau_joueur vaisseau { get; set; }

        public enum DeplacementEnum { DROITE, GAUCHE, HAUT, BAS };

        public void init()
        {
            vaisseau = new Vaisseau_joueur();
            Random rand = new Random();
            do
            {
                this.xJoueur = rand.Next(0, xSizeMap);
                this.yJoueur = rand.Next(0, ySizeMap);
                this.xFinal = rand.Next(0, xSizeMap);
                this.yFinal = rand.Next(0, ySizeMap);
            } while (checkWin());


            for (int x = 0; x < xSizeMap; x++)
            {
                for (int y = 0; y < ySizeMap; y++)
                {
                    visite[x, y] = false;
                }
            }
            for (int x = 0; x < xSizeMap; x++)
            {
                for (int y = 0; y < ySizeMap; y++)
                {
                    map[x, y] = new CaseInconnue();
                }
            }

            map[xFinal, yFinal] = new CaseFinale();
        }

        public Case genererCase()
        {
            int choixCase = rand.Next(100) + 1;
            if (visite[xJoueur, yJoueur])
            {
                if (choixCase < 60)
                    return new CaseVide();
                if (choixCase < 80)
                    return new CaseFight();
                if (choixCase < 85)
                    return new CaseDebris();
                return new CaseAsteroide();
            }
            else
            {
                if (choixCase < 20)
                    return new CaseVide();
                if (choixCase < 80)
                    return new CaseFight();
                if (choixCase < 85)
                    return new CaseDebris();
                return new CaseAsteroide();
            }
        }

        public void cleanCase()
        {
            map[xJoueur, yJoueur] = new CaseVide();
        }

        public void deplacement(DeplacementEnum dep)
        {
            if (dep == DeplacementEnum.BAS)
                yJoueur = (yJoueur + 1) % ySizeMap;
            else if (dep == DeplacementEnum.HAUT)
            {
                yJoueur = yJoueur - 1 % ySizeMap;
                if (yJoueur < 0) yJoueur += ySizeMap;
            }
            else if (dep == DeplacementEnum.GAUCHE)
            {
                xJoueur = (xJoueur - 1) % xSizeMap;
                if (xJoueur < 0) xJoueur += xSizeMap;
            }
            else if (dep == DeplacementEnum.DROITE)
                xJoueur = (xJoueur + 1) % xSizeMap;

            vaisseau.pe--;
        }

        public bool checkWin()
        {
            if (xJoueur == xFinal && yJoueur == yFinal) System.Diagnostics.Debug.WriteLine("Partie terminée, vous avez trouvé la réponse !");
            return xJoueur == xFinal && yJoueur == yFinal;
        }
        public bool jouer()
        {
            bool done = false;
            System.Diagnostics.Debug.WriteLine("PV : " + vaisseau.pv + "/" + vaisseau.getPvMax() + ". PE : " + vaisseau.pe + "/" + vaisseau.getPeMax() + ". Niveau : " + vaisseau.lvl + ". XP : " + vaisseau.xpLvl + "/100.");
            Array values = Enum.GetValues(typeof(DeplacementEnum));
            deplacement((DeplacementEnum)values.GetValue(rand.Next(values.Length)));
            done = checkWin();
            if (this.vaisseau.pv <= 0)
            {
                System.Diagnostics.Debug.WriteLine("Votre vaisseau a été détruit.");
                done = true;
            }
            else if (this.vaisseau.pe <= 0)
            {
                System.Diagnostics.Debug.WriteLine("Votre vaisseau n'a plus d'essence, il va donc errer pour l'éternité.");
                done = true;
            }
            if (!done)
            {
                map[xJoueur, yJoueur] = genererCase();
                map[xJoueur, yJoueur].declencherEffet(this);
            }


            return done;
        }

        public Case getCell(int pX, int pY) {
            Case c;

            int x = xJoueur, y = yJoueur;

            x += pX;
            y += pY;

            x += xSizeMap;
            y += ySizeMap;

            x %= xSizeMap;
            y %= ySizeMap;

            c = map[x, y];

            return c;
        }
    }
}
